// 在我们的眼里面Listan套接字也是一个链接，只不过比较他的处理读写的方式是比较特殊的
#pragma once
#include "Connection.hpp"
#include "Channel.hpp"
#include "Util.hpp"
class Listener : public Connection
{
public:
    Listener(uint16_t port)
        : _listener(std::make_unique<TcpSocket>()),
          _port(port)
    {
        _listener->BuildListenSocketMethod(_port);
        _sockfd = _listener->SockFd();
        SetEvents(EPOLLIN | EPOLLET); // 设置成EP模式也就是边缘除法，对应的文件描述符必须是非阻塞的
    };
    void Recver() override
    {
        std::cout << "ha ha 收到了一个消息" << std::endl;
        while (true)
        {
            InetAddr clientaddr;
            int error = 0;
            int sockfd = _listener->Accept(&clientaddr, &error);
            if (sockfd < 0)
            {
                if (errno == EAGAIN)
                    break;
                else if (errno == EINTR)
                    continue;
                else
                    break;
            }
            // 获取新链接成功, 能直接读取吗？不能！应该干什么？添加到Reactor中！
             // 1. 构建新的连接
            SetNonBlock(sockfd);
            std::shared_ptr<Connection> conn = std::make_shared<Channel>(sockfd, clientaddr);
            // 2. 添加到Reactor中？
            conn->SetCb(_cb);
            Owner()->AddConnection(conn);
            std::cout << "ha ha2222222 收到了一个消息" << std::endl;
        }
    }
    void Sender() override
    {
        // 不实现是一个空函数
    }
    void Excepter() override
    {

    }

    ~Listener() {};

private:
    std::unique_ptr<Socket> _listener;
    uint16_t _port;
};